<?php
include_once 'Conexion.php';
include_once 'PagoFactura.php';

class Factura extends Conexion {
    
    private $idFactura;
    private $idCliente;
    private $numFactura;
    private $monto;
    private $fechaEmision;
    private $estado;
    private $cancelada;
    
    public function obtenerTotalFacturas () {
        parent::conectar();
        
        $query = $this->ejecutarConsulta("SELECT SUM(monto) FROM `factura` WHERE cancelada=0");

        $row = mysql_fetch_array($query);
            
        if (!$row) {
            $total = 0;
        } else {
            $total = $row[0];
        }

        parent::desconectar();

        return $total * 1.16;
    }
    
    public function __construct($idCliente, $numFactura, $fechaEmision, $cancel) {
        $this->idCliente = $idCliente;
        $this->numFactura = $numFactura;
        $this->fechaEmision = $fechaEmision;
        $this->cancelada = $cancel;
    }


    public function registrar (Factura $nueva) {
        $this->conectar();
        
        $resul = $this->ejecutarQuery("INSERT INTO `factura`(`IDCLIENTE`, `NUMFACTURA`, `FECHAEMISION`, `ESTADO`, `CANCELADA`, `IDRAZONSOCIAL`) VALUES 
            ($nueva->idCliente,$nueva->numFactura, '$nueva->fechaEmision','P', $nueva->cancelada, 5)");
        
        $this->desconectar();
        
        return $resul;        
    }
    
    /*
     * Parametros
     *  idCliente: para saber a que facturas se hara el abono
     *  cantidad: la cantidad que se abonara
     *  tipo: para saber si es una Nota o un Deposito
     *  idConcepto: es el ID de la Nota o Deposito
     */
    public function abonarCantidadAFactu ($idCliente, $cantidad, $tipo, $idConcepto) {
        parent::conectar();
        
        //Recuperamos las facturas del cliente, que no esten canceladas, y que aun no esten liquidadas
        $sqlResul = parent::ejecutarConsulta("SELECT idfactura, numfactura, monto, cantidadpagada 
                                    FROM `factura` 
                                    WHERE estado='P' AND idcliente=$idCliente AND cancelada=0 
                                    ORDER BY numfactura");
        
        //Creamos las variables idDeposito y idNota, depende el TIPO de abono, se asigna a una el IDCONCEPTO
        //Antes determinamos de que tipo es la insersición
        if ($tipo == 'D') {
            $idDeposito = $idConcepto;
            $idNota = 0;
        } else if ($tipo == 'N') {
            $idDeposito = 0;
            $idNota = $idConcepto;
        }
        
        //Mientras tengamos facturas que ir pagando y la cantidad pagada aun no llegue a cero
        //seguimos abonando a las facturas
        while ($row = mysql_fetch_array($sqlResul)) {
            $montoFac = $row[2] * 1.16;
            $pagadoFac = $row[3];
            
            //Obtenemos la cantidad que falta por pagar de la factura
            $faltante = $montoFac - $pagadoFac;
            
            //Si la cantidad de pago es más pequeña que el faltante, se abona lo que sobre
            if ($cantidad <= $faltante) {
                
                parent::ejecutarQuery("UPDATE `factura` SET `CANTIDADPAGADA`=". ($pagadoFac + $cantidad) ." WHERE idfactura=$row[idfactura]");
                
                //Creamos el objeto PagoFactura, para luego registrar en la BD
                $pagoFac = new PagoFactura($row[idfactura], $idNota, $idDeposito, $cantidad);
                $pagoFac->registrar($pagoFac);
                
                echo "<h3>Se han abonado $ $cantidad a la factura $row[numfactura], aun falta para liquidarla $ ". ($montoFac - ($pagadoFac + $cantidad)) ."</h3>";
                
                //$cantidad = $cantidad - $faltante;
                
                parent::desconectar();
                
                return true;
                
            } else {
                
                //Creamos el objeto PagoFactura, para luego registrar en la BD
                $pagoFac = new PagoFactura($row[idfactura], $idNota, $idDeposito, $faltante);
                $pagoFac->registrar($pagoFac);
                
                /*Restamos a la cantidad lo que le falta a la factura para ser liquidado
                    Pago 10,000 
                        Monto   15,000
                        Pagado   7,500
                        Faltante 7,500
                */
                $cantidad = $cantidad - $faltante;
                
                parent::ejecutarQuery("UPDATE `factura` SET `ESTADO`='T', `CANTIDADPAGADA`=". (round( $montoFac, 2, PHP_ROUND_HALF_DOWN)) ." WHERE idfactura=$row[idfactura]");
                
                echo "<h3>Se ha liquidado la factura No. $row[numfactura]</h3>";
            }
        }
        
        parent::desconectar();
    }

    public function getFacturaByID ($idFactura) {
        
        $this->conectar();

        $sql = "SELECT idfactura, numfactura, monto, fechaemision, cantidadpagada, estado, nombre
                    FROM factura, cliente, razonsocial WHERE factura.idcliente=cliente.idcliente 
                            AND cliente.idrazonsocial=razonsocial.idrazonsocial AND idFactura=$idFactura";

        $sqlResult = $this->ejecutarConsulta($sql);

        $this->desconectar();

        return mysql_fetch_array($sqlResult);
    }
    
    //Regresa las facturas para el Reporte desglosado
    public function getFacturasReporte ($mes, $anio) {
        
        $this->conectar();

        //Invocamos la vista
        $sql = "SELECT numfactura, monto, fechaemision FROM factura WHERE cancelada=0 AND fechaemision>='$anio-$mes-01' AND fechaemision<'". ($mes == 12 ? ($anio+1) : $anio) ."-". ($mes == 12 ? 1 : $mes + 1) ."-01' ORDER BY fechaemision";

        $sqlResult = $this->ejecutarConsulta($sql);

        $this->desconectar();

        return $sqlResult;
    }
    
    public function getFacturasCobranza () {
        
        $this->conectar();

        $sql = "SELECT idfactura, numfactura, monto, fechaemision, cantidadpagada, estado
                FROM factura WHERE estado='P' AND cancelada=0";

        $sqlResult = $this->ejecutarConsulta($sql);

        $this->desconectar();

        return $sqlResult;
    }
    
    //Registra los Depositos y las Notas para ir pagando las Facturas, se hace por Numero de factura
    function registrarDepoNotaEnFacturas ($idCliente, $monto) {
        parent::conectar();
        
        $sqlResult = $this->ejecutarConsulta("SELECT * FROM `factura` WHERE idCliente=$idCliente AND estado='P' ORDER BY numfactura ASC");
        
        while ($tempFact = mysql_fetch_array($sqlResult)) {
            
        }
        
        parent::desconectar();
    }


    public function obtenerIdFactura ($numFactura, $fechaEmision) {
        $this->conectar();
                
        $query = $this->ejecutarConsulta("SELECT idFactura FROM factura WHERE numfactura=$numFactura AND fechaEmision='$fechaEmision'");
        
        $row = mysql_fetch_array($query);
            
        if (!$row) {
            $this->idFactura = 0;
        } else {
            $this->idFactura = $row[0];
        }
        
        $idFactura = $this->idFactura;

        parent::desconectar();

        return $idFactura;
    }
    
    public function recupertarMonto ($idFactura) {
        $this->conectar();
                
        $query = $this->ejecutarConsulta("SELECT monto FROM factura WHERE idFactura=$idFactura");
        
        $row = mysql_fetch_array($query);
            
        if (!$row) {
            $this->monto = 0;
        } else {
            $this->monto = $row[0];
        }
        
        $monto = $this->monto;

        parent::desconectar();

        return $monto;
    }
    
    public function recupertarDescuentos ($idFactura) {
        $this->conectar();
                
        $query = $this->ejecutarConsulta("SELECT montoCargo + montoCredito FROM factura WHERE idFactura=$idFactura");
        
        $row = mysql_fetch_array($query);
            
        if (!$row) {
            $this->monto = 0;
        } else {
            $this->monto = $row[0];
        }
        
        $monto = $this->monto;

        parent::desconectar();

        return $monto;
    }
    
    public function getLiquidadas () {
        
        $this->conectar();

        $sql = "SELECT idfactura, numfactura, monto, fechaemision, cantidadpagada, estado
                FROM factura WHERE estado='T'";

        $sqlResult = $this->ejecutarConsulta($sql);

        $this->desconectar();

        return $sqlResult;
    }
    
    public function liquidarFactura ($idFactura) {
        $this->conectar();
                
        $result = $this->ejecutarQuery("UPDATE factura SET estado='T' WHERE idFactura=$idFactura");

        parent::desconectar();

        return $result;
    }

    public function getIdFactura() {
        return $this->idFactura;
    }

    public function setIdFactura($idFactura) {
        $this->idFactura = $idFactura;
    }

    public function getIdCliente() {
        return $this->idCliente;
    }

    public function setIdCliente($idCliente) {
        $this->idCliente = $idCliente;
    }

    public function getNumFactura() {
        return $this->numFactura;
    }

    public function setNumFactura($numFactura) {
        $this->numFactura = $numFactura;
    }

    public function getMonto() {
        return $this->monto;
    }

    public function setMonto($idFactura, $monto) {
        $this->conectar();
        
        $resul = $this->ejecutarQuery("UPDATE `factura` SET `MONTO`=$monto WHERE idFactura=$idFactura");
        
        $this->desconectar();
        
        return $resul;        
    }

    public function getFechaEmision() {
        return $this->fechaEmision;
    }

    public function setFechaEmision($fechaEmision) {
        $this->fechaEmision = $fechaEmision;
    }

    public function getNotaCargo() {
        return $this->notaCargo;
    }

    public function setNotaCargo($notaCargo) {
        $this->notaCargo = $notaCargo;
    }

    public function getMontoCargo() {
        return $this->montoCargo;
    }

    public function setMontoCargo($montoCargo) {
        $this->montoCargo = $montoCargo;
    }

    public function getNotaCredito() {
        return $this->notaCredito;
    }

    public function setNotaCredito($notaCredito) {
        $this->notaCredito = $notaCredito;
    }

    public function getMontoCredito() {
        return $this->montoCredito;
    }

    public function setMontoCredito($montoCredito) {
        $this->montoCredito = $montoCredito;
    }

    public function getEstado() {
        return $this->estado;
    }

    public function setEstado($estado) {
        $this->estado = $estado;
    }
}
?>